package util

import "reflect"

func AppendDeduplicateCanNull[T comparable](slice []T, elems T) []T {
	if !ArrayContains(slice, elems) {
		slice = append(slice, elems)
	}
	return slice
}

func AppendDeduplicate[T comparable](slice []T, elems T) []T {
	if !reflect.ValueOf(&elems).Elem().IsZero() && !ArrayContains(slice, elems) {
		slice = append(slice, elems)
	}
	return slice
}

func ArrayContains[T comparable](array []T, e T) bool {
	for _, v := range array {
		if v == e {
			return true
		}
	}
	return false
}

func DifferenceSet[K comparable](a1, a2 []K) (d1, d2 []K) {
	var vMap = map[K]*int{}
	for _, v1 := range a1 {
		vMap[v1] = Addr[int](1)
	}
	for _, v2 := range a2 {
		if vMap[v2] == nil {
			vMap[v2] = Addr[int](2)
		} else {
			vMap[v2] = Addr[int](0)
		}
	}
	for k, v := range vMap {
		if *v == 1 {
			d1 = append(d1, k)
		} else if *v == 2 {
			d2 = append(d2, k)
		}
	}
	return d1, d2
}
